package com.hh.config;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.util.StringUtils;
import org.springframework.web.client.RestTemplate;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;

/**
 * @Author 辉辉 2022/8/21 0:05
 */
@EnableConfigurationProperties(value = WxProperties.class)
@Configuration
@Slf4j
public class WxAutoConfiguration {

    @Autowired
    private RestTemplate restTemplate;

    @Resource
    private WxProperties wxProperties;

    private String wxAccessToken;

    /**
     * 这个spring实现了这个注解的规范
     * 在所有的bean创建完以后执行，在项目启动完成之前执行
     * 限制：方法不能有返回值 也不可以有参数
     */
    @PostConstruct
    public void tokenInit() {
        getAccessToken();
    }

    /**
     * 获取微信的access-token
     * accessToken有有效期 所以使用定时任务刷新
     * 默认是2小时后失效
     * 所以来个定时任务7100秒后执行
     * 因为上面执行了一次这个方法获取了accessToken所以这个要在项目启动7100秒执行
     */
    @Scheduled(initialDelay = 7100 * 1000, fixedRate = 7100 * 1000)
    public void getAccessToken() {
        String accessTokenUrl = wxProperties.getAccessTokenUrl();
        String realUrl = String.format(accessTokenUrl, wxProperties.getAppId(), wxProperties.getAppSecret());
        log.info("获取access-token开始，地址：{}", realUrl);
        String accessTokenJsonStr = restTemplate.getForObject(realUrl, String.class);
        JSONObject jsonObject = JSON.parseObject(accessTokenJsonStr);
        String accessToken = jsonObject.getString("access_token");
        if (!StringUtils.isEmpty(accessToken)) {
            // 保存起来 可以放在redis中
            wxAccessToken = accessToken;
        } else {
            log.error("获取微信的access-token失败");
        }
    }

    public String getWxAccessToken() {
        return wxAccessToken;
    }

    public void setWxAccessToken(String wxAccessToken) {
        this.wxAccessToken = wxAccessToken;
    }
}
